//
//  RZConversationViewController.h
//  RZIM
//
//  Created by reyzhang on 2021/8/4.
//  聊天会话

#import "YMIMBaseViewController.h"
#import <YMIMLib/YMIMLib.h>
#import "YMChatInputBarControl.h"
#import "YMConversationCollectionViewHeader.h"
#import "YMConversationViewLayout.h"
#import "YMMessageCell.h"


NS_ASSUME_NONNULL_BEGIN

@interface YMConversationViewController : YMIMBaseViewController<UICollectionViewDelegate,UICollectionViewDataSource>

#pragma mark - 初始化

/*!
 初始化会话页面

 @param conversationType 会话类型
 @param targetId         目标会话ID (单聊传用户id, 群聊传groupId)

 @return 会话页面对象
 */
- (id)initWithConversationType:(YMConversationType)conversationType targetId:(NSString *)targetId label:(NSInteger)label;
- (id)initWithConversationType:(YMConversationType)conversationType targetId:(NSString *)targetId;

#pragma mark - 会话属性

/*!
 当前会话的会话类型
 */
@property (nonatomic) YMConversationType conversationType;
@property (nonatomic, strong) __block YMConversation *conversation;
/*!
 目标会话ID
 */
@property (nonatomic, copy) NSString *targetId; //私聊传递的是用户id, 群聊是groupId
/**
 标签
 */
@property(nonatomic,assign) NSInteger label;

#pragma mark - 会话页面属性
/**
 进入页面时定位的消息的发送时间
 用于消息搜索之后点击进入页面等场景
 */
@property (nonatomic, assign) long long locatedMessageSentTime;

/*!
 设置进入会话页面后下拉刷新从远端获取消息的条数，默认是 10。
 此属性需要在viewDidLoad之前进行设置。
 */
@property (nonatomic, assign) int defaultRemoteHistoryMessageCount;

@property (nonatomic, strong) NSMutableArray *conversationDataRepository;


@property (nonatomic, strong) YMConversationViewLayout *flowLayout;
/*!
 会话页面的CollectionView
 */
@property (nonatomic, strong,nullable) UICollectionView *conversationMessageCollectionView;

@property (nonatomic, strong) YMConversationCollectionViewHeader *collectionViewHeader;

/*!
 收到的消息是否显示发送者的名字
 默认值为YES。
 您可以针对群聊、聊天室、单聊等不同场景，自己定制是否显示发送方的名字。
 */
@property (nonatomic) BOOL displayUserNameInCell;



/*!
 该会话的未读消息数
 */
@property (nonatomic, assign) NSInteger unReadMessage;

@property (nonatomic, assign) BOOL needAutoScrollToBottom;

#pragma mark - 输入工具栏

/*!
 会话页面下方的输入工具栏
 */
@property (nonatomic, strong) YMChatInputBarControl *chatInputBarControl;
/*!
 输入框的默认输入模式
 默认值为ChatInputBarInputText，即文本输入模式。 请在[super viewWillAppear:animated]之后调用
 */
@property (nonatomic) ChatInputBarInputType defaultInputType;

/*!
 输入框中内容发生变化的回调

 @param inputTextView 文本输入框
 @param range         当前操作的范围
 @param text          插入的文本
 */
- (void)inputTextView:(UITextView *)inputTextView
    shouldChangeTextInRange:(NSRange)range
            replacementText:(NSString *)text;

/*!
 输入工具栏尺寸（高度）发生变化的回调

 @param chatInputBar 输入工具栏
 @param frame        输入工具栏最终需要显示的Frame

 @discussion 如重写此方法，请先调用父类方法。
 */
- (void)chatInputBar:(YMChatInputBarControl *)chatInputBar shouldChangeFrame:(CGRect)frame;

/*!
 扩展功能板的点击回调
 @param pluginBoardView 输入扩展功能板View
 @param tag             输入扩展功能(Item)的唯一标示
 */
- (void)pluginBoardView:(YMPluginBoardView *)pluginBoardView clickedItemWithTag:(NSInteger)tag;

#pragma mark - 界面操作

/*!
 滚动到列表最下方

 @param animated 是否开启动画效果
 */
- (void)scrollToBottomAnimated:(BOOL)animated;

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath;



#pragma mark flag
@property (nonatomic, assign) BOOL isConversationAppear;
@property (nonatomic, assign) BOOL isTakeNewPhoto;//发送的图片是否是刚拍摄的，是拍摄的则决定是否写入相册
@property (nonatomic, assign) BOOL isContinuousPlaying;     //是否正在连续播放语音消息
@property (nonatomic, assign) BOOL isTouchScrolled; /// 表示是否是触摸滚动


#pragma mark - 自定义消息

/**
 * 注册自定义cell
 */
- (void)registerCustomCell:(Class)cellClass forIdentifier:(NSString *)identifier;




/*!
 自定义消息Cell显示的回调

 @param collectionView  当前CollectionView
 @param indexPath       该Cell对应的消息Cell数据模型在数据源中的索引值
 @return                自定义消息需要显示的Cell

 */
- (YMMessageCell *)ymCustomConversationCollectionView:(UICollectionView *)collectionView
                                   cellForItemAtIndexPath:(NSIndexPath *)indexPath;

/*
 自定义消息Cell大小的回调

 @param collectionView          当前CollectionView
 @param collectionViewLayout    当前CollectionView Layout
 @param indexPath               该Cell对应的消息Cell数据模型在数据源中的索引值
 @return                        自定义消息Cell大小的回调
 */
- (CGSize)ymCustomConversationCollectionView:(UICollectionView *)collectionView
                                      layout:(UICollectionViewLayout *)collectionViewLayout
                      sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

#pragma mark - 钩子
- (YMMessage *)willSendMessage:(YMMessage *)message;

- (YMMessage *)willAppendAndDisplayMessage:(YMMessage *)message;


#pragma mark - 点击事件回调

/*!
 点击Cell中的消息内容的回调

 @param model 消息Cell的数据模型

 SDK在此点击事件中，针对SDK中自带的图片、语音、位置等消息有默认的处理，如查看、播放等。
 您在重写此回调时，如果想保留SDK原有的功能，需要注意调用super。
 */
- (void)didTapMessageCell:(YMMessageInfo *)model;

/*!
 长按Cell中的消息内容的回调

 @param model 消息Cell的数据模型
 @param view  长按区域的View

 @discussion SDK在此长按事件中，会默认展示菜单。
 您在重写此回调时，如果想保留SDK原有的功能，需要注意调用super。
 */
- (void)didLongTouchMessageCell:(YMMessageInfo *)model inView:(UIView *)view;



/*!
 点击Cell中头像的回调

 @param userId  点击头像对应的用户ID
 */
- (void)didTapCellPortrait:(NSString *)userId;

/*!
 长按Cell中头像的回调

 @param userId  头像对应的用户ID
 */
- (void)didLongPressCellPortrait:(NSString *)userId;




@end

NS_ASSUME_NONNULL_END
